package org.example.线程;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class CompletableFuture使用 {


//    public static void main(String[] args) throws ExecutionException, InterruptedException {
//        // 自定义线程池
//        ExecutorService executorService = Executors.newSingleThreadExecutor();
//        CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> {
//            System.out.println("do something....");
//            return "result";
//        }, executorService);
//
//        //等待子任务执行完成
//        System.out.println("结果->" + cf.get());
//    }

    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(3);

        try {
            CompletableFuture.runAsync(() -> {
                System.out.println(Thread.currentThread().getName() + "come in execute works..");
                // 睡眠3s,说明异步任务处理结果需要3s
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 异步任务执行结束
                System.out.println(Thread.currentThread().getName() + "works over..");
            }, pool).whenComplete((res,e) ->{ // 这里就是回调函数的地方,当任务结束后,会调用该函调函数
                // res-->异步任务的结果
                // e --> 异步任务中的异常信息
                // 在里面,可以根据异步任务的处理结果,进行别的操作,比如rpc调用,操作数据库啊等等操作!!!
                if (e == null) {
                    System.out.println(Thread.currentThread().getName() + "异步任务执行结束了, 回调到当前" +
                            "的该回调方法中了;...当前获取到结果为" + res);
                }
            }).exceptionally((e)->{
                e.printStackTrace();
                return null;
            });
        } finally {
            pool.shutdown();
        }

        System.out.println("main处理其他任务了....");
        System.out.println("main一直在做其他的事情,避免了调用get获取结果时的阻塞情况!!!!");
    }
}
